<%-- Created by IntelliJ IDEA. User: 韩顺平
Version: 1.0
Filename: rest --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>rest </title>
    <script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#deleteBook").click(function () {
                alert("ok");
                alert("ok");
                alert("ok");
                alert("ok");
                alert("ok");
                var href = this.href;
                $("#hiddenForm").attr("action", href);
                $(":hidden").val("DELETE");
                $("#hiddenForm").submit();//这里就是提交删除请求了
                //这里必须返回 false,否则会提交两次
                return false;
            });
        })
    </script>
</head>
<body>
<h3>Rest 风格的 crud 操作案例</h3>
<br><hr>
<h3>rest 风格的 url 查询书籍[get]</h3>
<a href="user/book/100">点击查询书籍</a>
<br><hr>
<h3>rest 风格的 url 添加书籍[post]</h3>
<form action="user/book" method="post">
    name:<input name="bookName" type="text"><br>
    <input type="submit" value="添加书籍">
</form>
<br><hr>
<h3>rest 风格的 url, 删除一本书</h3>


<%--
  解读：
    1.默认情况下<a href="user/book/600">删除指定 id 的书</a>  的请求方式是get，并不会调用后端的delet
    2.那么如何将get请求转换成springmvc能识别的delete，就需要考虑我们配置的HiddenHttpMethodFilter过滤器机制
       ① public static final String DEFAULT_METHOD_PARAM = "_method";
         ！！需要注意：前端传进来的name值必须是_method
       ② if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {
            String paramValue = request.getParameter(this.methodParam);
            if (StringUtils.hasLength(paramValue)) {
                String method = paramValue.toUpperCase(Locale.ENGLISH);
                if (ALLOWED_METHODS.contains(method)) {
                    requestToUse = new HttpMethodRequestWrapper(request, method);
                }
            }
         如果请求方式是POST，我们就进行一些判断处理
         获取HttpServletRequest的方法参数 method，如果这个值不为空，将其转换成大写，本文值为DELETE
         ALLOWED_METHODS是HiddenHttpMethodFilter的一个类对象，默认值为HttpMethod.PUT.name(), HttpMethod.DELETE.name(), HttpMethod.PATCH.name()
         如果ALLOWED_METHODS的值包含method，则将requestToUse转换成对应的值（本文requestToUse的值是DELETE）


    3.从上述代码可以看出，HiddenHttpMethodFilter过滤器对以Post提交的delete，put，patch请求进行替换，成为可以被springmvc识别的请求方式
    4.我们可以使用jquery来处理
    <a href="user/book/600">删除指定 id 的书</a>

--%>
<a href="user/book/600" id="deletBook">删除指定的书</a>
<form action="" method="post" id="hiddenForm">
    <input type="hidden" name="_method">
</form>

<%--修改--%>


<br><hr>
<h3>rest 风格的 url 修改书籍[put]~</h3>
<form action="" method="">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="修改书籍~">
</form>
</body>
</html>